//
//  AVCaptureLowVersionViewController.h
//  CaptureDemo
//
//  Created by 苏沫离 on 2018/9/18.
//  Copyright © 2018年 苏沫离. All rights reserved.
//

#import <UIKit/UIKit.h>

/* 适用于 iOS 8 ~ iOS 10.2 
 *
 * 使用 AVCaptureStillImageOutput 捕获图像
 */
@interface AVCaptureLowVersionViewController : UIViewController

@end

/*
 OC之输出管理 AVCaptureOutput
 
 ####1、输出数据管理 AVCaptureOutput
 
 [AVCaptureOutput](https://developer.apple.com/documentation/avfoundation/avcaptureoutput?changes=latest_minor&language=objc) 继承 ```NSObject```，是输出数据管理。该对象将会被添加到会话```AVCaptureSession```中，用于接收会话```AVCaptureSession```各类输出数据。
 ```AVCaptureOutput```提供了一个抽象接口，用于将捕获输出目的地(如文件和视频预览)连接到捕获会话```AVCaptureSession```的实例。捕获输出可以有多个由```AVCaptureConnection```对象表示的连接，一个连接对应于它从捕获输入(```AVCaptureInput```的实例)接收的每个媒体流。捕获输出在首次创建时没有任何连接。当向捕获会话添加输出时，将创建连接，将该会话的输入的媒体数据映射到其输出。
 调用```AVCaptureSession```的```-addOutput:```方法将```AVCaptureOutput```与```AVCaptureSession```关联。
 
 
 
 #####1.1、访问连接 ```AVCaptureConnection```
 
 ```
 @property(nonatomic, readonly) NSArray<AVCaptureConnection *> *connections;
 ```
 
 捕获输出对象的连接。
 
 
 ```
 - (AVCaptureConnection *)connectionWithMediaType:(AVMediaType)mediaType;
 ```
 
 返回 ```connections ```数组中具有指定媒体类型的输入端口的第一个连接，如果未找到与指定媒体类型的连接，则为nil。
 
 
 #####1.2、在坐标系之间转换
 
 - (AVMetadataObject *)transformedMetadataObjectForMetadataObject:(AVMetadataObject *)metadataObject
 connection:(AVCaptureConnection *)connection;
 将AVMetadataObject的可视属性转换为接收器的坐标。
 
 metadataObject AVMetadataObject源自与接收器相同的AVCaptureInput。
 connection 捕获连接，其AVCaptureInput与要转换的元数据对象的连接匹配。
 返回值：其属性为输出坐标的AVMetadataObject，如果metadataObject源自预览图层以外的输入源，则为nil。
 
 此方法将提供的AVMetadataObject的坐标空间中的可视属性转换为接收器的坐标空间。
 转换将方向，镜像和缩放考虑在内，并改变所提供的元数据对象的可视属性，以匹配接收器通过指示的连接提供的样本缓冲区的物理旋转和镜像。
 这意味着对于视频数据输出（AVCaptureVideoDataOutput），调整的元数据对象坐标将被旋转和镜像。
 对于静止图像（AVCaptureStillImageOutput）和电影文件（AVCaptureMovieFileOutput）输出，它们不是。
 相反，在回放时确定这两种类型的输出的元数据对象坐标的旋转和镜像。
 
 
 将捕获输出对象坐标系中的矩形转换为用于元数据输出的坐标系中的矩形。
 - (CGRect)metadataOutputRectOfInterestForRect:(CGRect)rectInOutputCoordinates;
 rectInOutputCoordinates     AVCaptureOutput对象坐标系中的矩形。
 返回值：AVCaptureMetadataOutput坐标系中的矩形。
 
 AVCaptureMetadataOutput对象感兴趣的矩形位于从左上角的（0,0）到右下角的（1,1）的坐标系中，相对于设备的自然方向。 捕获输出对象使用可以缩放，旋转或镜像的像素坐标空间。 使用此便捷方法可在坐标空间之间快速转换。
 
 
 将用于元数据输出的坐标系中的矩形转换为捕获输出对象坐标系中的矩形。
 - (CGRect)rectForMetadataOutputRectOfInterest:(CGRect)rectInMetadataOutputCoordinates;
 rectInMetadataOutputCoordinates AVCaptureMetadataOutput坐标系中的矩形。
 返回值： AVCaptureOutput对象坐标系中的矩形。
 
 
 AVCaptureMetadataOutput对象感兴趣的矩形位于从左上角的（0,0）到右下角的（1,1）的坐标系中，相对于设备的自然方向。 捕获输出对象使用可以缩放，旋转或镜像的像素坐标空间。 使用此便捷方法可在坐标空间之间快速转换。
 
 
 
#####1.3、```AVCaptureOutput``` 的一系列子类


```AVCaptureOutput```是个抽象类，我们必须使用它的子类；常用的```AVCaptureOutput```的子类如下所示：

![AVCaptureOutput继承关系图.png](https://upload-images.jianshu.io/upload_images/7112462-57932584bdc8f26e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


* ```AVCaptureAudioDataOutput``` ：一种捕获输出，用于记录音频，并在录制音频时提供对音频样本缓冲区的访问。
* ```AVCaptureAudioPreviewOutput``` ：一种捕获输出，与一个核心音频输出设备相关联、可用于播放由捕获会话捕获的音频。
* ```AVCaptureDepthDataOutput``` ：在兼容的摄像机设备上记录场景深度信息的捕获输出。
* ```AVCaptureMetadataOutput``` ：用于处理捕获会话```AVCaptureSession```产生的定时元数据的捕获输出。
* ```AVCaptureStillImageOutput``` ：在macOS中捕捉静止照片的捕获输出。该类在iOS 10.0中被弃用，并且不支持新的相机捕获功能，例如原始图像输出和实时照片。在iOS 10.0或更高版本中，使用```AVCapturePhotoOutput```类代替。
* ```AVCapturePhotoOutput``` ：静态照片、动态照片和其他摄影工作流的捕获输出。
* ```AVCaptureVideoDataOutput``` ：记录视频并提供对视频帧进行处理的捕获输出。
* ```AVCaptureFileOutput``` ：用于捕获输出的抽象超类，可将捕获数据记录到文件中。
* ```AVCaptureMovieFileOutput``` ：继承自```AVCaptureFileOutput```，将视频和音频记录到QuickTime电影文件的捕获输出。
* ```AVCaptureAudioFileOutput``` ：继承自```AVCaptureFileOutput```，记录音频并将录制的音频保存到文件的捕获输出。
 
 
 
####2、拍照 AVCaptureStillImageOutput
 
 
 [AVCaptureStillImageOutput](https://developer.apple.com/documentation/avfoundation/avcapturestillimageoutput?changes=latest_minor&language=objc) 捕捉静态照片，该类在 ```iOS 10.0``` 中已弃用，不支持较新的相机捕获功能，如RAW图像输出和实时照片。在 ```iOS 10.0``` 及更高版本中，改用```AVCapturePhotoOutput```类。
 
 #####2.1、捕捉图像
 
 我们可以调用下述方法捕获图像：
 
 ```
 - (void)captureStillImageAsynchronouslyFromConnection:(AVCaptureConnection *)connection
 completionHandler:(void (^)(CMSampleBufferRef imageDataSampleBuffer, NSError *error))handler;
 ```
 
 
 捕获图像后要调用的 ```handler``` 中的参数：
 * 参数```imageDataSampleBuffer``` ：捕获的数据：包含适合于图像数据格式的元数据。例如，包含```JPE```G数据的缓冲区可以携带```kCGImagePropertyExifDictionary```作为附件。
 * 参数 ```error```： 如果请求失败，返回NSError对象。
 
 
 可以使用下述属性查看是否正在捕获图像：
 ```
 @property(readonly, getter=isCapturingStillImage) BOOL capturingStillImage;
 ```
 
 
 #####2.2、配置图像设置
 
 属性|类型|描述
 -|-|-
 ```availableImageDataCVPixelFormatTypes```|```NSArray<NSNumber *>```|支持的图像像素格式，可以将其用作```outputSettings```属性中```kCVPixelBufferPixelFormatTypeKey```的值。
 ```availableImageDataCodecTypes```|```NSArray<AVVideoCodecType>```|支持的图像编解码器格式，可以将其用作```outputSettings```属性中```AVVideoCodecKey```的值。
 
 ```outputSettings```|```NSDictionary<NSString *,id>```|输出设置。
 
 
 
 
 #####2.3、图像格式转换
 
 将静态图像数据```CMSampleBufferRef```转为```NSData```
 
 ```
 + (NSData *)jpegStillImageNSDataRepresentation:(CMSampleBufferRef)jpegSampleBuffer;
 ```
 
 参数```CMSampleBufferRef```： 携带 ```JPEG``` 图像数据的样本缓冲区，如果```jpegSampleBuffer```为 ```NULL``` 或不是```JPEG``` 格式，则此方法抛出异常```NSInvalidArgumentException```。
 
 
 #####2.4、创建静止图像输出
 
 ```
 - (instancetype)init;
 + (instancetype)new;
 ```
 
 创建新的静止图像输出。
 
 
 
 
 */
